<?php

/**
 * Сравнивает значение с предельно допустимым.
 *
 */
abstract class Kernel_Validator_Extreme extends Kernel_Validator_Abstract {

    /**
     * Сообщение об ошибке, если значение выходит за предел включительно.
     *
     * @var string
     */
    protected $ERROR_INCLUSIVE;

    /**
     * Сообщение об ошибке, если значение выходит за предел не включительно.
     *
     * @var string
     */
    protected $ERROR_STRICT;

    /**
     * Включать ли сами крайнее значение как допустимое.
     *
     * @var boolean
     */
    public $inclusive = true;

    /**
     * Проверяет правильность указанного значения
     *
     * @param   mixed   $value
     * @throws  Kernel_Validator_Exception
     */
    protected function _validate($value) {
        $extreme = $this->_getExtreme();
        if (!$this->_compare($value, $extreme)) {
            $this->_error(__($this->_getMessage(), $extreme));
        }
    }

    /**
     * Возвращает предельное значение.
     *
     * @return  mixed
     */
    abstract protected function _getExtreme();

    /**
     * Сравнивает значение с предельным.
     *
     * @param   mixed $value
     * @param   mixed $extreme
     * @return  boolean
     */
    abstract protected function _compare($value, $extreme);

    /**
     * Возвращает сообщение, которое нужно выставить в соотв. с параметрами
     * валидатора.
     *
     * @return  string
     */
    private function _getMessage() {
        return $this->inclusive ? $this->ERROR_INCLUSIVE : $this->ERROR_STRICT;
    }
}
